﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed?

#pragma once
#include "GcmpRenderingInterface.h"
#include "Color.h"
#include "Vector3d.h"
#include <string>
#include "NdbDataSchema.h"

namespace gcmp
{
    /// \brief 天空类型
    SERIALIZABLE_ENUM_CLASS(SkyType)
    {
        None = 0,                        ///<无效类型
        Atmosphere = 1,     ///<大气散射
        Sphere = 2                ///<天空球
    };


    /// \brief 天空属性设置接口类
    class GCMP_RENDERING_INTERFACE_EXPORT ISkyOptions
    {
    public:
        /// \brief 析构函数
        virtual ~ISkyOptions() {}

        /// \brief 设置天空类型
        /// \param skyType 天空类型
        /// \return 
        virtual void SetSkyType(SkyType skyType) = 0;

        /// \brief 获取天空类型
        /// \return 返回当前的天空类型
        virtual SkyType GetSkyType() const = 0;

        /// \brief 设置天空球纹理目录
        /// \param resourceDirectory 纹理目录，只有当天空类型为Sphere时需要设置该参数，调用SetSkyType之后如果不调用该接口，天空球使用默认纹理
        /// \return 设置成功返回true；当bat或者纹理文件不存在时，返回false
        /// \note 目录中必须包含Sky_Blue.png和Sky_Clouds.png，否则返回false
        /// Sky_Blue.png和Sky_Clouds.png分别是天空和云的纹理贴图
        virtual bool SetTextureDirectory(const std::wstring& resourceDirectory) = 0;

        /// \brief 打开天空功能
        /// \return 
        /// \note 默认天空是打开的，天空类型为NONE
        virtual void EnableSky() = 0;

        /// \brief 关闭天空
        /// \return 
        virtual void DisableSky() = 0;

        /// \brief 设置地面的颜色
        /// \param groundColor 地面的颜色，只支持设置RGB，透明度无效
        /// \return 设置成功返回true； 如果当前天空类型不支持设置地面颜色,或当前设备不能支持该功能，返回false
        virtual bool SetGroundColor(const Color& groundColor) = 0;

        /// \brief 获取地面的颜色
        /// \return 返回地面颜色，只支持RGB
        virtual Color GetGroundColor() const = 0;

        /// \brief 设置地面的纹理
        /// \param filePath 纹理文件的全路径
        /// \return 设置成功返回true；当纹理文件不存在或者创建纹理对象失败时返回false
        virtual bool SetGroundTexture(const std::wstring& filePath) = 0;

        /// \brief 设置太阳方位角
        /// \param horizontalAngle 方位角的角度, 范围[0, 360]
        /// \return 设置成功返回true；如果当前天空类型不支持设置太阳的方位角，返回false
        /// \note 太阳的方位角和高度角通过计算转换成光源的方向，设置给光源
        virtual bool SetSunHorizontalAngle(double horizontalAngle) = 0;

        /// \brief 获取太阳方位角
        /// \return 返回太阳方位角的角度
        virtual double GetSunHorizontalAngle() const = 0;

        /// \brief 设置太阳的高度角
        /// \param verticalAngle 太阳的高度角，范围[0, 90]
        /// \return 设置成功返回true；如果当前天空类型不支持设置太阳的高度角，返回false
        /// \note 太阳的方位角和高度角通过计算转换成光源的方向，设置给光源
        virtual bool SetSunVerticalAngle(double verticalAngle) = 0;

        /// \brief 获取太阳的高度角
        /// \return 返回太阳的高度角，角度
        virtual double GetSunVerticalAngle() const = 0;

        /// \brief 设置是否使用太阳光进行渲染
        /// \param isRenderedBySunLight，true表示使用太阳光进行渲染；false表示不使用，默认值false
        /// \return 设置成功返回true，否则返回false
        virtual bool SetIsRenderedBySunLight(bool isRenderedBySunLight) = 0;

        /// \brief 获取是否使用太阳光进行渲染
        /// \return true，使用太阳光进行渲染；false，不使用太阳光进行渲染
        virtual bool IsRenderedBySunLight() const = 0;

    };
}

